package com.lancoo.edu.platform.operation.commons.utils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * LocalDateTime 工具类
 * @author pky
 */
public class LocalDateTimeUtil {

    /**
     * 获取指定日期所属周的周一的日期
     * @param localDate 日期
     * @return 周一日期
     */
    public static LocalDateTime getMondayForThisWeek(LocalDate localDate) {
        return LocalDateTime.of(localDate, LocalTime.MIN).with(DayOfWeek.MONDAY);
    }

    /**
     * 获取指定日期所属周的周日的日期
     * @param localDate 日期
     * @return 周日的日期
     */
    public static LocalDateTime getSundayForThisWeek(LocalDate localDate) {
        return LocalDateTime.of(localDate, LocalTime.MIN).with(DayOfWeek.SUNDAY);
    }

    /**
     * 获取指定日期所属周的下周一的日期
     * @param localDate 日期
     * @return 下周一的日期
     */
    public static LocalDateTime getMondayForNextWeek(LocalDate localDate) {
       return LocalDateTime.of(localDate, LocalTime.MIN).plusWeeks(1).with(DayOfWeek.MONDAY);
    }

    /**
     * 获取指定日期所属周的下周日的日期
     * @param localDate 日期
     * @return 下周日的日期
     */
    public static LocalDateTime getSundayForNextWeek(LocalDate localDate) {
        return LocalDateTime.of(localDate, LocalTime.MIN).plusWeeks(1).with(DayOfWeek.SUNDAY);
    }

    /**
     * 指定格式为"yyyy-MM-dd HH:mm:ss"的字符串时间转化为LocalDateTime类型
     * @param dateStr 要转换的日期字符串
     * @return LocalDateTime类型
     */
    public static LocalDateTime getLocalDateTimeFromString(String dateStr) {
        return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * LocalDateTime类型转化为格式为"yyyy-MM-dd HH:mm:ss"的字符串时间类型
     * @param localDateTime 日期
     * @return 已转化的日期字符串
     */
    public static String getStringFromLocalDateTime(LocalDateTime localDateTime) {
        return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * Date类型时间转化为LocalDateTime类型
     * @param date 日期
     * @return LocalDateTime类型
     */
    public static LocalDateTime getLocalDateTimeFromDate(Date date) {
        return date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime();
    }

    /**
     * LocalDateTime类型转化为Date类型时间
     * @param localDateTime 日期
     * @return Date
     */
    public static Date getDateFromLocalDateTime(LocalDateTime localDateTime) {
        return Date.from(localDateTime.toInstant(ZoneOffset.of("+8")));
    }

    /**
     * 获取指定时间的00:00:00
     * @param localDateTime 日期
     * @return 00:00:00
     */
    public static LocalDateTime getLocalDateTimeForBegin(LocalDateTime localDateTime) {
        return LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MIN);
    }

    /**
     * 获取指定时间的23:59:59
     * @param localDateTime 日期
     * @return 23:59:59
     */
    public static LocalDateTime getLocalDateTimeForEnd(LocalDateTime localDateTime) {
        return LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MAX);
    }

    /**
     * 时间戳(毫秒)转化为LocalDateTime格式
     * @param timestamp 时间戳
     * @return LocalDateTime
     */
    public static LocalDateTime getLocalDateTimeFromTimestamp(Long timestamp) {
        return LocalDateTime.ofEpochSecond(timestamp/1000, 0, ZoneOffset.ofHours(8));
    }

    /**
     * LocalDateTime格式转化为时间戳(毫秒)
     * @param localDateTime 日期
     * @return 时间戳
     */
    public static Long getTimestampFromLocalDateTime(LocalDateTime localDateTime) {
        return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
    }
}
